T1-买宝珠(pearl)
鲁国突然从齐的侧翼发动反击,早已被锁链连接的齐国战车这时无法灵活的转过来应敌。于是,齐军一击即溃,只能丢盔弃甲,仓皇而逃。
在逃跑过程中,鲍叔牙竟然弄丢了管仲代购的鲁国特产。
已知鲁国特产是由 n−1 条丝带连接 n 个宝珠构成的。即你可以将鲁国特产看成一棵树。
树的每条边上的颜色都是 k 种颜色中的一种。如果树上的一条路径是彩色的,意味着这条路径上至少包含两种不同颜色的边。
鲍叔牙还记得 m 条彩色路径的起点和终点。他现在想知道满足条件的树有多少可能?
由于答案可能很大,所以请将答案对 109+7 取模。
3≤n≤60,1≤ai,bi,cj,dj≤n,1≤m≤15,2≤k≤109。
考虑暴力枚举每个人的决策,同时维护在前 i 轮决策下,当前的 S 集合,如果 S=∅,那么立刻返回 0。时间复杂度是 O(nm) 的,因为每次决策都会把 S 分成两个不交的集合,每个元素都只会向一侧递归,一共递归 m 层。
考虑对于先手来说,每次进行决策,如果他选择集合大小更小的那一侧,那么每次操作集合大小减半,需要 logn 次操作就可以使答案为 0,那么当 m>2logn 的时候,答案不可能大于 0。同理答案不可能小于 0,因此答案一定是 0。
时间复杂度 O(nlogn)。
T2-玩游戏(game)
小 X 和小 Y 是好朋友,有一天他们在玩游戏,规则是:
- 小 X 先手,小 Y 后手,轮流进行操作,共有 m 轮操作,有一个集合初始为 S=a1,a2,⋯,an。
- 第 i 轮操作有一个参数 bi,当前轮的操作者有以下两个选择:保留 S 中所有是 bi 倍数的数字,或者保留 S 中所有不是 bi 倍数的数字。
- 进行了 m 轮操作后两人获得的权值是 S 中的数字之和,S 可以为空。
小 X 希望权值最小,小 Y 希望权值最大,假设他们足够聪明,那么游戏最终的权值是多少。
1≤n≤2×104,1≤m≤2×105,−4×1014≤ai≤4×1014,1≤bi≤4×1014。
考虑不合法的方案。
如果 m≥2,这样算会重复计算多条路径同时不合法的方案,我们发现 n≤60,m≤15,于是可以直接暴力枚举容斥。
具体来说,就是枚举不合法路径的集合 S,对于每条路径,把它所有边合并到某一条边上(如果路径有相交,当然是合并成一条边了)。然后统计合并后的边数 cnt,当 ∣S∣ 为偶数,让答案加上 cnt,当 ∣S∣ 为奇数,让答案减去 cnt,枚举路径集合可以直接状态压缩,合并可以用并查集实现。
时间复杂度为 O(nm2m)。
T3-游乐场(playground)
有 n 个人来游乐场玩水上飞人,第 i 个人想玩至少 ai 次,每次水上飞人恰好有两个人游玩,并且为了防止无聊,两个人 u,v 至多一块玩一次水上飞人。每个人有一个勇气值 vi,如果他的勇气值大于等于所有和他一块玩过水上飞人的人,那么他会收获 bi 的快乐值;如果他的勇气值小于等于所有和他一块玩过水上飞人的人,那么他会收获 ci 的快乐值。但如果他的勇气值恰好等于所有和他一块玩过水上飞人的人(或者没有和任何人玩过水上飞人),他并不能获得 bi+ci 的快乐值,而是只能获得 max(bi,ci) 的快乐值。并且如果他的勇气值既不同时大于等于也不同时小于等于所有和他一起玩过的人,他就会生气并把游乐场炸掉。除此以外,如果有人没玩够 ai 次水上飞人,或者有两个人 u,v 一块玩了至少两次水上飞人,游乐场也会被炸掉。
作为游乐场的管理员,你要规划若干次水上飞人,使得游乐场不会被炸掉,并且所有人的快乐值之和最大,如果无解输出 −1。
n≤400,0≤ai≤n,1≤vi≤n,0≤bi,ci≤109。
我们可以把题意改写:给每个人钦定他是大还是小,然后再判断每个人是否合法。对于一个人 p,设勇气值小于他的人的个数为 xp,其中选大的人的个数是 rp;勇气值大于他的人的个数为 yp,其中选小的人的个数是 tp;勇气值等于他的人的个数是 dp,判句是:若 p 选大,则 ap≤xp+dp−1−rp;若 p 选小,则 ap≤yp+dp−1−tp。
先处理勇气值互不相同的情况。考虑按勇气值从小到大考虑人,那么记录一下当前有多少个人选大以及前面选小的人限制后面最多选几个小就能判断然后转移了。具体来说设 dp 状态 fi,j,k 表示考虑完前 i 人,选了 j 个大的,i+1 及以后最多选 k 个小的,那么转移为:
fi−1,j,k+bi→fi,j+1,k(ai≤i−1−j),fi−1,j,k+ci→fi,j,min(k−1,n−i−ai)
暴力做复杂度 O(n3)。
如果有相同的,那就不能直接以某一个顺序依次转移每个人。考虑把勇气值相同的人一块考虑,那么状态 fi,j,k 改为表示考虑完 vp≤i 的 ,选了 j 个大的,vp>i 的 p 中最多选 k 个小的,对于每一组勇气值相同的人我们只用知道选了几个大以及选小的内部最紧的限制即可像之前一样转移,但暴力实现复杂度最劣 O(n4)。考虑把第二种转移里的取 min 改成分类讨论,如果是 n−p−ap 则只需要知道 fi−1,j,k 的 max;如果是 k−l(l 为选的小的个数),考虑维护一个转移数组 hi−1,j,k,即 fi−1,j,k+q→fi,j,k−l 的最大系数 ,不难发现原来的转移相当于让 k 这一维上的一个前缀的系数对一个数取 max。使用后缀优化即可做到 O(n3)。
T4-子矩阵(matrix)
你要维护一个 n×m 的矩阵 A,其中第 i 行第 j 列的元素记作 Ai,j。行和列从 1 开始标号。初始时这个 n×m 的矩阵是全为 0 的 01 矩形。
你需要支持 q 个操作,每个操作都是将一个从 (x1,y1) 到 (x2,y2) 的矩形反转,矩形反转即将矩阵中的元素 0 变 1 或者 1 变 0。
你需要在所有操作结束之后,对最后的矩形求出有多少个子矩形,子矩阵要求:非空且连续,第一列全为 1 或者最后一列全为 1。
答案对 998244353 取模。
1≤n,m,q≤2×105,1≤x1≤x2≤n,1≤y1≤y2≤m。
考虑从左往右扫,使用支持区间反转的数据结构(平衡树)维护珂朵莉树,中间 tag 翻转,左右两边 split 或者 merge。
考虑对于 ds 中的维护的一个区间,自诞生之日起它可能当过 0 也当过 1,然后记录—下它当过多少次 1 记为 a,考虑它对答案的贡献。
因为我们要的是对于 21n(n+1) 个区间,每个区间求出 m 列中有多少列全为 1,容易发现上面的一个区间 (i,j) 会对 i≤x≤y≤j 的 (x,y) 都产生 a 的贡献。考虑这个东西在被破开连续段之前贡献只有两种,即取反和不取反,通过颜色段均摊之后我们可以拆成 O(n) 个这样的 (i,j),求出每一个区间 (i,j) 后扫描线 + 线段树维护即可。
复杂度 O(nlogn)。